package model

import "fmt"

/*
1.什么是封装:
封装(encapsulation)就是把抽象出的字段和对字段的操作封装在一起,数据被保护在内部,程序的其他包只有通过被授权的操作方法,
才能对字段进行操作

2.封装的好处:
1)隐藏实现细节
2)可以对数据进行验证,保证安全合理

3.golang中如何实现封装
1)建议将结构体,字段(属性)的首字母小写(其他包不能使用,类似private,实际开发不小写也可能,因为封装没有那么严格)
2)给结构体所在包提供一个工厂模式的函数,首字母大写(类似一个构造函数)
3)提供一个首字母大写的Set方法(类似其他语言的public),用于对属性判断并赋值
func (var 结构体类型名)SetXxx(参数列表){
	//加入数据验证的业务逻辑
	var.Age = 参数
}
4)提供一个首字母大写的Get方法(类似其他语言的public),用于获取属性值
func (var 结构体类型名)GetXxx(返回值列表){
	return var.字段
}
*/

type person struct {
	Name string
	age  int
}

func NewPerson(name string) *person {
	return &person{
		Name: name,
	}
}

//定义set和get方法
func (p *person) SetAge(age int) {
	if age >= 0 && age < 200 {
		p.age = age
	} else {
		fmt.Println("传入年龄不在限定范围内")
	}
}

func (p *person) GetAge() int {
	return p.age
}
